# 定义基于社区划分和IC模型的种子节点选择算法
def community_PR(communities, seed_size, initial_seed=[]):
    """
    基于社区划分和PageRank值的种子节点选择算法

    Args:
        G (networkx.Graph): 图数据
        seed_size (int): 选择种子节点的数量
        initial_seed (list): 初始的种子节点列表

    Returns:
        list: 选择出的新种子节点列表
    """
    # 初始化新种子节点列表
    new_seed = []
    # 选择符合条件的种子节点直到达到数量要求或无法选择出新的种子节点
    set_seed = set(initial_seed)
    while len(new_seed) < seed_size:
        for com in communities:
            node_set = set(com) - set(new_seed)
            sorted_node = sorted(node_set, key=lambda x: initial_seed.index(x) if x in set_seed else len(set_seed))
            first_element = next(iter(sorted_node), None)
            if first_element is None:
                continue
            new_seed.append(first_element)
            # 如果已经达到种子节点数量要求，则退出社区遍历
            if len(new_seed) >= seed_size:
                break
        # 如果无法选择出新的种子节点，则退出算法
        if len(new_seed) == 0:
            break
    # 返回选择出的新种子节点列表
    return new_seed
